class Message<T> {
    private T message ;
    //此时T是成员属性的类型

    //此时T是返回值类型
    public T getMessage() {
        return message;
    }

    public void setMessage(T message) {
        //将传入的引用赋给私有成员变量
        this.message = message;
    }

}
class Organizm{
    String name;
}
class  Animal extends Organizm{
    String name;
}
class Dog extends Animal{
         String name;
}
class Cat extends Animal{
       String name;
}
public class Test {
    public static void main2(String[] args) {
        //关于通配符上届的问题：
        //通配符上届的格式为： <? extends 指定的类名> ，表示传入的类型参数必须是指定类或者是指定类的子类
        Message<Dog> message1 = new Message<>();
        Message<Cat> message2 = new Message<>();
        Message<Animal> message3 = new Message<>();

        fun1(message1);
        //通配符下界的格式为：<? super 指定的类名> ，  表示传入的类型参数必须是指定类或指定类的父类
        fun2(message1);
    }
    public static void main1(String[] args) {
        //关于泛型进阶的使用
        Message<String> message = new Message<>() ;
        message.setMessage("我是张三");
        fun(message);
        Message<Integer> message1 = new Message<>();
        //当执行fun方法，传入message1时，则报错，即此fun方法有了局限性
        fun(message1);
        //如果使用通配符？表示可以接收所有的参数类型,则再执行：
    }
    public static void fun(Message<?> message){
        System.out.println(message);
    }



    public static void fun1(Message<? extends  Animal> temp){
        //报错的原因为传入的可能是Cat类对象，或Animal对象，根据不能放入Dog类中去
        temp.setMessage(new Dog());
        temp.getMessage();
    }
    public static void fun2(Message<? super Dog> message){
        message.setMessage(new Dog());
        //不能存放Cat对象是因为Dog类与Cat类并无直接的关系。
        message.setMessage(new Cat());
        //不能放Animal对象，是因为如果传入的实参类型为Dog类型，则不能存放Animal对象
        message.setMessage(new Animal());   //为什么不能用Animal？
    }



}
